}
else
{
- unsigned int aa = (255 << 16) / src[3];
- *dst++ = (src[0] * aa) >> 16;
- *dst++ = (src[1] * aa) >> 16;
- *dst++ = (src[2] * aa) >> 16;
+ unsigned int aa = ((255 << 16) + (src[3] >> 1)) / src[3];
+ *dst++ = (src[0] * aa + 0x8000) >> 16;
+ *dst++ = (src[1] * aa + 0x8000) >> 16;
+ *dst++ = (src[2] * aa + 0x8000) >> 16;
*dst++ = src[3];
}
src += 4;
}
else
{
- unsigned int aa = (255 << 16) / src[3];
- *dst++ = (src[0] * aa) >> 16;
- *dst++ = (src[1] * aa) >> 16;
- *dst++ = (src[2] * aa) >> 16;
+ unsigned int aa = ((255 << 16) + (src[3] >> 1)) / src[3];
+ *dst++ = (src[0] * aa + 0x8000) >> 16;
+ *dst++ = (src[1] * aa + 0x8000) >> 16;
+ *dst++ = (src[2] * aa + 0x8000) >> 16;
*dst++ = src[3];
}
src += 4;
}
else
{
- unsigned int aa = (255 << 16) / alpha;
- *dst++ = (src[0] * aa) >> 16;
- *dst++ = (src[1] * aa) >> 16;
- *dst++ = (src[2] * aa) >> 16;
+ unsigned int aa = ((255 << 16) + (alpha >> 1)) / alpha;
+ *dst++ = (src[0] * aa + 0x8000) >> 16;
+ *dst++ = (src[1] * aa + 0x8000) >> 16;
+ *dst++ = (src[2] * aa + 0x8000) >> 16;
}
src += 4;
}